import Http from '@/api/http';
import FileInfo from '@/structure/fileInfo';

/**
 * 基础路径
 */
export const BASE_URL = 'uploader';

/**
 * 文件类型
 */
type UFile = File | string;

/**
 * 数据转换
 * @param file 文件或文件blob字符串
 * @return blob对象
 */
function conversion(file: UFile): Blob {
  if (file instanceof File) {
    return file;
  }

  const arr = file.split(',');
  const a0Match = arr[0].match(/:(.*?);/) || [];
  const mime = a0Match[1];
  const blobStr = atob(arr[1]);
  let n = blobStr.length;
  const u8arr = new Uint8Array(n);

  while (n--) {
    u8arr[n] = blobStr.charCodeAt(n);
  }

  return new Blob([u8arr], {
    type: mime
  });
}

/**
 * 上传
 */
class UploadApi extends Http {
  /**
   * 单一文件上传
   * @param file 文件
   * @param path 上传路径
   * @return 文件信息
   */
  public single(file: UFile, path: string | null | undefined): Promise<FileInfo> {
    const fd = new FormData();

    fd.append('file', conversion(file));

    return super.post0(BASE_URL + '/single/' + (path ? path : ''), fd);
  }

  /**
   * 多文件上传
   * @param fileList 文件列表
   * @param path 上传路径
   * @return 文件信息列表
   */
  public multiple(fileList: UFile[], path: string | null | undefined): Promise<FileInfo> {
    const fd = new FormData();

    fileList.forEach((file) => fd.append('fileList', conversion(file)));

    return super.post0(BASE_URL + '/multiple/' + (path ? path : ''), fd);
  }
}

export default new UploadApi();
